package easy;

public class Question13 {

    public static void main(String[] args) {
        Question13 question13 = new Question13();
        System.out.println(question13.romanToInt("III"));
        System.out.println(question13.romanToInt("IV"));
        System.out.println(question13.romanToInt("IX"));
        System.out.println(question13.romanToInt("LVIII"));
        System.out.println(question13.romanToInt("MCMXCIV"));
    }

    // 因为减法由两个限制条件：
    // 1.左减的数仅限于I(1)\X(10)\C(100)；
    // 2.左减时不可跨越一个位值。
    // 所以基本元素有：
    // I V X L C D M IV IX XL XC CD CM

    //    把原字符串里的IV IX XL XC CD CM替换成一位的字符，
//    对每一个位switch
//    public int romanToInt(String s) {
//        String str = replace(s);
//        int length = str.length();
//        int result = 0;
//        for (int i = 0; i < length; i++) {
//            result += getValue(str.charAt(i));
//        }
//        return result;
//    }
//
//    private String replace(String s) {
//        String str = s.replace("IV", "a");
//        str = str.replace("IX", "b");
//        str = str.replace("XL", "c");
//        str = str.replace("XC", "d");
//        str = str.replace("CD", "e");
//        str = str.replace("CM", "f");
//        return str;
//    }
//
//    private int getValue(Character ch) {
//        switch (ch) {
//            case 'a':
//                return 4;
//            case 'b':
//                return 9;
//            case 'c':
//                return 40;
//            case 'd':
//                return 90;
//            case 'e':
//                return 400;
//            case 'f':
//                return 900;
//            case 'I':
//                return 1;
//            case 'V':
//                return 5;
//            case 'X':
//                return 10;
//            case 'L':
//                return 50;
//            case 'C':
//                return 100;
//            case 'D':
//                return 500;
//            case 'M':
//                return 1000;
//            default:
//                return 0;
//        }
//    }

    // 比较当前位与下一位的大小
//    public int romanToInt(String s) {
//        int length = s.length();
//        int result = 0;
//        for(int i =0;i < length-1;i++){
//            int current = getValue(s.charAt(i));
//            int next = getValue(s.charAt(i+1));
//            result = current < next ? (result  - current) : (result + current);
//        }
//        result += getValue(s.charAt(length - 1));
//        return result;
//    }
//    public int getValue(char ch){
//        int result = 0;
//        switch(ch){
//            case 'I': result = 1;
//                break;
//            case 'V': result = 5;
//                break;
//            case 'X': result = 10;
//                break;
//            case 'L': result = 50;
//                break;
//            case 'C': result = 100;
//                break;
//            case 'D': result = 500;
//                break;
//            case 'M': result = 1000;
//                break;
//        }
//        return result;
//    }


    //    因为只有IXC可能时左减数，所以：
    public int romanToInt(String s) {
        int length = s.length();
        int result = 0;
        for (int i = 0; i < length - 1; i++) {
            char currentChar = s.charAt(i);
            int current = getValue(currentChar);
            if (!leftNumber(currentChar)) {
                result += current;
            } else {
                int next = getValue(s.charAt(i + 1));
                result = current < next ? (result - current) : (result + current);
            }
        }
        result += getValue(s.charAt(length - 1));
        return result;
    }

    private boolean leftNumber(char character) {
        return character == 'I' || character == 'X' || character == 'C';
    }

    public int getValue(char ch) {
        int result = 0;
        switch (ch) {
            case 'I':
                result = 1;
                break;
            case 'V':
                result = 5;
                break;
            case 'X':
                result = 10;
                break;
            case 'L':
                result = 50;
                break;
            case 'C':
                result = 100;
                break;
            case 'D':
                result = 500;
                break;
            case 'M':
                result = 1000;
                break;
        }
        return result;
    }
}
